#include<bits/stdc++.h>
using namespace std;
const int N = 4;
bool vis[N][N];
int d[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int ans = 0;

// 每次都需要清空上次保留的访问信息
void setEmpty() {
    for (int m = 0; m < 4; m++) {
        for (int n = 0; n < 4; n++) {
            vis[m][n] = false;
        }
    }
}
// 在区域内 返回 true 不在返回false
bool isArea(int x, int y) {
    if (x >= 0 && x < 4 && y >= 0 && y < 4)
        return true;
    return false;
}

void dfs(int x, int y, int step) {
    // 不在区域 或者当前位置被访问过 直接返回
    if (!isArea(x, y) || vis[x][y] == true) return;
    // 步数到了16 算正确的结果
    if (step == 16) {
        ans++;
        return;
    }
    vis[x][y] = true;
    for (int i = 0; i < 4; i++) {
        int nx = x + d[i][0], ny = y + d[i][1];
        dfs(nx, ny, step + 1);
    }
    vis[x][y] = false;
}

int main() {
    // 每一个格子遍历以1开始遍历一边；
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            setEmpty();
            dfs(i, j, 1);
        }
    }
    cout << ans << endl;
    return 0;
}